OptaneP4800X的技术启示
由Intel主导的3D Xpoint这种固态存储介质想必大家已经在近2年内听过很多次了,近期,随着Intel正式发布Optaine P4800X产品,3D Xpoint介质也终于揭开了神秘面纱。鄙人的朋友@唐僧_huangliang 黄亮也在第一时间发布了针对P4800X的实测数据,有兴趣者可以关注黄亮的“企业存储技术”公众号阅读相应的文章。本文中的部分图片和测试结果数据引用自黄亮的文章。本文旨在思考和讨论P4800X这种产品的应用场景和前景,仅代表冬瓜哥个人意见。
本文目录:
1. 再次强调时延和带宽的关系
2. 低时延场景
3. Optane P4800X两者兼得
4. 其它应用场景和方式讨论
众所周知,3D Xpoint介质具有远低于NAND Flash的的访问时延,而且同NAND Flash一样具有天然的掉电数据保持性,也就是所谓的Persistent,而且具有比NAND更高的寿命。这使得其具有很大潜力作为一种相比NAND Flash更优的在线大容量存储介质。但是目前其技术不开放,冬瓜哥目前并不了解其内部的详细耕作原理以及各种参数。目前刚刚推出市场,有待挖掘更多的应用场景和实现更多的组合方案。
OptaineP4800X主打的就是其相比NAND更低的时延,如果抛开时延因素,看最高IOPS吞吐量的话,P4800X依然可以达到比目前主流NAND Flash产品高一截的IOPS,但是此时相比NAND而言就不具备性价比优势了。下文中会给出一些具体测试结果。那么,时延对整体性能的影响为何如此关键呢?
1. 再次强调时延和吞吐量的关系
首先,冬瓜哥想再次为大家普及一下时延和吞吐量之间的关系。在应用程序到存储设备之间有多个处理模块以及硬件部件,一笔I/O请求从应用发出,一直到存储设备执行完毕并最终被应用程序所感知到,这个过程耗费的时间就是本I/O的时延。当然,一笔I/O请求在I/O协议栈上走的路以及被存储设备执行的越慢,时延就会越高,性能就越差。这是普遍理解,这个理解没有错,但是不准确。
时延高,并不意味着吞吐量低,比如,在一个时延为1秒的链路上,依然可以跑出数百GB/s的吞吐量,一个简单的例子比如国际光缆上的吞吐量很高,但是访问跨国资源的时延却很高,体现为:当在浏览器中输入网址并回车后,几秒钟之后可能才有反应,并且按照正常速度显示出网页。此时你不能说该系统“性能差”,只能称之为“时延高”。再比如一个例子,卫星直播,远程主播的话总是有一定的时延,有时可能达到数秒,但是一旦第一句话传了过来,后面的话就会源源不断的传过来,体现出与本地播出同样的效果。此时说明,该信道存在数秒钟的时延,但是其信道的比特率/吞吐量是可以满足要求的。
当然,要达到上面的效果,需要一个关键的处理,那就是将I/O充分的异步化、深队列/缓冲化。试想,如果在一条高时延(2秒)链路上,通信的双方这样来会话: A:你好。2秒后。B:你好。2秒后。A:你准备好了么? 2秒后。B:准备好了。两秒后。A:那好,我要开始说了,可以么?两秒后。20秒后。A:人呢,还在么?
B去哪了?B已经把摄像机砸烂了。因为此时已经过去了10秒,磨叽的A却还在说废话。如果整个过程是这样的:A:你好能听到我说话么?2秒后。B:可以请讲。2秒后。A:好的,请描述一下您今天采访川普的感受。2秒后。B:@#¥%.....(持续了3分钟)。可以看到只用了4秒钟就建立了会话并开始了正文,而且B源源不断的说话。
同样的事情,放到I/O系统中来看的话,如果应用程序发出一个I/O请求之后,直到存储设备返回I/O结果,才继续发送下一个I/O的话(同步I/O方式),那就像那个磨叽的主播A了。更理想的做法是将要表达的事情批量的一次性连贯的表达给对方而不关心对方是否已经收到、何时收到,反正对方总会收到,这就是异步I/O方式。这样对方会在一个并且只有一次时延单位时间之后接收到连续的高吞吐量的信息。
但是很不幸,有不少的应用程序在I/O方面都磨叽型的,这其中有多种原因,比如缺乏I/O优化设计,以及由业务模型本身决定了必须采用同步的I/O方式,比如业务必须知道前一笔I/O的返回内容并做一定分析判断后才决定下一笔I/O何时、访问何地、内容如何。
对于磨叽型应用,你除了降低I/O路径的时延来提升性能,别无他法。但是,降时延是一件很难的事情。I/O路径上的时延是有各个处理模块以及硬件链路积累而成的,降时延意味着要么砍掉某些模块,要么优化某些模块,所以难。而对于支持异步I/O的程序,增加并发度则是提升整体吞吐量的最简便做法,虽然每个通道上的时延并无降低,但是可以多个I/O并发执行。请注意,并发可以是物理并发,也可以是流水线这种逻辑并发,具体参考冬瓜哥《大话流水线》系列文章。
站在应用程序角度来感受的话,有下面的总结:
1. 对于单线程的同步I/O的应用,高时延单/多通道链路带来的是反应慢、吞吐量低的极差体验。也就是说,当你打开一个网页,不但浏览器状态栏半天才会从“正在连接”变到“正在接收数据”,而且“正在接收数据”这个状态也会持续很长时间,网页上的内容慢腾腾的逐步显示出来。
2. 对于多个或者多线程同步I/O应用并发访问场景,高时延单通道链路带来的是更慢上加慢让人无法忍受甚至最终让应用I/O超时引发宕机的灾难性体验。因为多线程会争抢唯一的一个通道,导致整体访问时延中不得不增加I/O的等待时延这个分量,也就是等待其他线程让出通道,自己被调度上通道。
3. 对于多个或者多线程同步I/O应用并发访问场景,高时延多通道链路带来的是反应慢、吞吐量低的极差体验。但是只要线程数量没有超过并发通道数,并且可以保证每个线程独占一个通道,那么多个线程并发之后,每个线程的体验是均等的,并不会像#2情况那样严重。
4. 对于单线程异步I/O应用,高时延单通道链路,体验与#2一致。
5. 对于单线程异步I/O应用,高时延多通道链路,体验较好,因为其可以利用其其他多个通道,从而可以提升整体吞吐量。
在这里,所谓“通道”是个虚拟的逻辑概念。其可以是真正的物理通道,比如多个网络接口,也可以是诸如缓冲队列这种能够实现流水作业的机制。具体可以参考冬瓜哥另外一个系列的文章《大话流水线1/2/3》,这里不再敖述。
I/O路径上的两个关键参数:时延和并发度。这里可以参考冬瓜哥另这篇:《为何测试时性能吊炸天上线却惨不忍睹》。时延越低,越有利于单线程同步I/O应用的性能,并发度越高,越有利于异步I/O应用。
2. NAND Flash的时延和吞吐量
SSD,飞一样的感觉,这感觉不需要冬瓜哥用艺术性的语言来描述的,大家都体验过。但是你可能并不知道的是,NAND Flash介质本身的访问时延,尤其是写入时的时延,其实相对是比较高的,一般在几十μs,在擦除或者某些写放大场景下甚至上到ms级别。假设某Flash写入时延为50μs,那么换算成每秒IOPS为1000x1000/50=20000IOPS。每秒2万的写IOPS,这个性能基本上就是一块企业级SATA SSD的普遍性能,而且已经算比较好的了。要知道上述是按照一片Flash颗粒的Program Latency算出来的,实际产品中随容量不同会有多片Flash,假设如果为8片,那么8片并发写理论上应该能达到16万才对,然而却只有那些顶级高端的NVMe SSD才能达到这个数值。其原因就是因为低端的企业级SATA SSD采用的颗粒的Programm延迟多在90μs上下,另外,SATA SSD的Over Provision为了成本考虑也并不会做的太高,这样就有更大的写放大系数,还有,其控制器从规格、算法等方面并不会对颗粒和写放大做更加深度的优化。综上这些因素,导致实际的吞吐量远低于理论值。NAND Flash由于必须先擦后写,而且要考虑磨损均衡,这本身就给写性能带来了不稳定和不可预测性,导致写性能抖动范围加宽,这对一些高性能应用来讲有致命影响,这与在高速路上急刹车导致的可能后果如出一辙。
3. 时延和并发度相关应用场景分析
那么,时延和并发度这两个关键参数,现实中都对应着哪些应用场景呢?综合来讲,OLTP类应用对时延和并发度都要求比较高,但是对时延更加敏感。OLTP的业务特征决定了其I/O中具有大量比例的同步I/O,而且有些批量异步I/O整体上可能取决于某个同步I/O,也就是只有某个I/O执行完毕,后续才会发出批量异步I/O,这种关联关系隐含的更加深,不容易被察觉。比如99个异步I/O依赖于1个同步I/O,观测者可能错误的得出同步I/O占比1%的结论,但是实际上这个效应会让等效占比高一些。当这样的场景经过时间积累之后,产生的效应将扩散更加广泛,形成错综复杂的同步牵连,整体性能也受到拖累。正因如此,降低时延,提升同步I/O成分的性能,对OLTP业务算是雪中送炭。同时,由于OLTP类业务常常伴随着较大的并发交易会话,多个不同的终端同时向服务器发起查询、更新等操作,此时又需要增加并发度来承载更多的前端连接数。所以,OLTP业务对性能的要求属于最高的,也是最难优化的,在SSD出现之前,通常都是使用大规模外置存储系统中的数百甚至上千块机械硬盘,加上数十上百GB的前置RAM当缓存来解决。
再来说说OLAP类业务。这类业务对时延不敏感,而通常只要求吞吐量足够高即可。这便让人如释重负了,因为增加并发度相对而言更易操作,比如增加硬盘数量,不行就增加机器的数量,形成集群,将数据拆分,进行分布式存储和运算。
OLTP业务一般为各种交易型业务,也就是有人在等待要求越快出结果越好的那些业务,比如电商、各种窗口业务等。OLAP则一般为后台运行的、并不要求立即出结果的那些业务,比如大数据分析、报表等。可见,OLTP类业务与我们的生活有着直接关系,其直接与人打交道,关系着人的体验,占用着人的等待时间。而OLAP业务并不直接影响我们的生活,但是其输出的结果会被用来做决策和规划,会在更长的时间周期内产生持续深远的影响。
那么,结论很明显,优化OLTP类业务的性能会获得更大的用户体验收益。而优化OLTP最敏感的时延,则事半功倍。然而,摆在眼前的问题则是,时延太难以优化了。人们应对此问题的方法一般是:一砖撂倒,上SSD。然而,基于NAND Flash的SSD的写时延、写抖动,是其不能承受之重。虽然相比HDD而言有天壤之别,但是从长久来看,这种天生的“缺陷”可能注定会让NAND Flash在存储器历史上称为昙花一现,也并不是不可能。
4. Optane P4800X两者兼得
3DXpoint 作为Intel主推的下一代存储介质,具有性能及其稳定不抖动,写时无需擦除,不需要考虑寿命问题等优点,是一种非常优良的介质,克服了NAND的写寿命、均衡、抖动问题。在等待了1年多后,Intel终于在近期发布了Optane P4800X基于3D XPoint介质的SSD产品。对这款产品的具体介绍,@唐僧_huangliang已经在其公众号“企业存储技术”中给出了详细的介绍和分析,在此冬瓜哥就不多介绍了。
可以看到,即便在QD=16时,Optane的吞吐量就已经达到了顶峰,证明其时延足够低。那些并发数较低的业务,则可以直接用Optane来享受到近乎满并发时候的吞吐量,可谓四两拨千斤。如果说基于NAND的SSD对OLTP类业务是闷热空气中的一台空调的话,那么基于3D XPoint的Optane P4800X就是一瓶冰镇啤酒,半拉冰镇沙瓤西瓜,让人感觉到彻底的骨子里的凉爽。
随着并发度的提升,Optane的吞吐量并无大变化,但是平均时延会逐渐增加。可以看到Optane的增加步进是20->100_>871,而NAND的则是102->155->1094,很显然,Optane的时延随队列深度/并发度的增加步进更加陡峭。这充分证明了Optane内部并没有为高并发场景准备更多的硬件队列或者软件线程。其中原因可能是因为3D XPoint介质自身的属性,而冬瓜哥猜测更可能是因为成本因素限制而而无法做到较高的并发单元数量。不过,成本问题会随着普及度而自然解决。
5. 其它应用场景和方式讨论
众所周知,目前偏计算的大数据分析类业务,对内存的需求可谓是有多少来多少,总不够用,因为这个互联网时代产生的数据量实在是大的可怕。既然Optane的时延介于SDRAM与NAND FLash之间,最重要的是即便是单线程单并发访问吞吐量也能达到较高值,那么能否将其作为一种内存扩展来使用?Intel的确提供了这种使用方法,但是需要预先安装一个底层虚拟化软件,将Optane的容量虚拟成系统直接可用的RAM空间。或者,可以将/swap放置到Optane块设备上,大大提升page in/out的时的性能,从而变相的扩充了系统RAM。
此外,黄亮的“企业存储技术”公众号即将推出Optane在Oracle场景下的实测结果和解析,有兴趣的观众可关注并收看。
6. 小结
Optane从根本上克服了NAND Flash的天生缺陷,利用更低和更稳定的时延,即便在很低的并发度下也能达到系统吞吐量的顶峰,天生适用于OLTP类业务。当然,根据当前的测试结果来看,冬瓜哥认为Optane后续有很大的优化空间,那就是适当增加一下内部的并发度,从而可以在高并发场景下,让平均时延增加的更加缓慢,这样其性能表现将会非常理想!
看来不少NANDFlash工程师在几年内要失业或者转业了?目测这世界要疯!:(